package net.assemble.emailnotify.core.preferences; import android.content.Context; import android.content.res.TypedArray; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.View; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import net.assemble.emailnotify.core.R; /** * シークバーと選択中の値を表示するプリファレンス */ public class NumberSeekbarPreference extends DialogPreference { private int mValue; // 選択中の値 private int mMinValue; // 最小値 private int mMaxValue; // 最大値 private String mUnit; // 表示単位 private String mZero; // 0のときの表示 public NumberSeekbarPreference(Context context, AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.number_seekbar_dialog); setPositiveButtonText(android.R.string.ok); setNegativeButtonText(android.R.string.cancel); mMinValue = attrs.getAttributeIntValue(null, "minValue", -1); mMaxValue = attrs.getAttributeIntValue(null, "maxValue", -1); mUnit = context.getResources().getString(attrs.getAttributeResourceValue(null, "unit", -1)); int zero = attrs.getAttributeResourceValue(null, "zero", -1); if (zero != -1) { mZero = context.getResources().getString(zero); } } public void setValue(int value) { mValue = value; persistInt(value); } @Override protected Object onGetDefaultValue(TypedArray a, int index) { return a.getInt(index, 0); } @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { setValue(restoreValue ? getPersistedInt(mValue) : (Integer) defaultValue); } @Override protected void onBindDialogView(View view) { super.onBindDialogView(view); final TextView textView = getTextView(view); final SeekBar seekBar = getSeekBar(view); seekBar.setMax(mMaxValue); seekBar.setProgress(mValue); seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mValue = seekBar.getProgress(); if (mValue < mMinValue) { mValue = mMinValue; seekBar.setProgress(mValue); } if (mValue == 0 && mZero != null) { textView.setText(mZero); } else { textView.setText(mValue + mUnit); } } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} }); if (mValue == 0 && mZero != null) { textView.setText(mZero); } else { textView.setText(mValue + mUnit); } } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { setValue(mValue); } } public int getValue() { return mValue; } protected static TextView getTextView(View dialogView) { return (TextView) dialogView.findViewById(R.id.number); } protected static SeekBar getSeekBar(View dialogView) { return (SeekBar) dialogView.findViewById(R.id.seekbar); } }